স্বল্প সময়ের জন্য ডেটাবেজে কোনো তথ্য জমা রাখতে SQL অস্থায়ী(Temporary) টেবিল ব্যবহার করা হয়।
- অস্থায়ী টেবিলের অনেক ধরণের সুবিধা রয়েছে। RDBMS ডেটাবেজ সিস্টেমে অস্থায়ী টেবিল সাপোর্ট করে।
- অস্থায়ী টেবিল ব্যবহার করে আপনি ডেটাবেজ টেবিলে তথ্য জমা রাখার পাশাপাশি অন্যান্য টেবিলের মত
SELECT
,UPDATE
,JOIN
ইত্যাদি SQL কমান্ড সম্পাদন করতে পারবেন।- অস্থায়ী তথ্য সংরক্ষনের জন্য কিছু কিছু ক্ষেত্রে অস্থায়ী টেবিল অতীব প্রয়োজন হয়ে পড়ে। যেমন- বর্তমান ইউজারের শেষন(session) সমাপ্ত হবে এমন সময় তার সকল তথ্য মুছে ফেলার জন্য অস্থায়ী টেবিল ব্যবহৃত হয়। MySql ভার্সন ৩.২৩ এবং পরবর্তী ভার্সন-সমূহে অস্থায়ী টেবিল যুক্ত হয়েছে।
বিঃদ্রঃ যতক্ষন পর্যন্ত শেষন(session) সক্রিয় থাকে কেবল ততক্ষন পর্যন্তই অস্থায়ী টেবিলে তথ্য সংরক্ষিত থাকে।
আপনি যদি পিএইচপি স্ক্রিপ্ট এর মাধ্যমে SQL কোড রান করান তাহলে পিএইচপি কোড সম্পাদন শেষে অস্থায়ী(Temporary) টেবিলে সংরক্ষিত তথ্য স্বয়ংক্রিয়ভাবে মুছে যাবে।
আপনি যদি MySQL ডেটাবেজকে এক্সেস(Access) করার জন্য MySql Client Program ব্যবহার করে থাকেন তাহলে প্রোগ্রামটি বন্ধ হওয়ার পরে অস্থায়ী টেবিলটি মুছে যাবে। অথবা আপনি নিজ থেকে ম্যানুয়ালিও টেবিলটি মুছে ফেলতে পারেন।
CREATE TEMPORARY TABLE name_of_table (
name_of_column,
name_of_column,
...
);
নিম্নের উদাহরনে আমরা অস্থায়ী টেবিলের ব্যবহার দেখবোঃ
CREATE TEMPORARY TABLE Student_works (
Student_name VARCHAR(50) NOT NULL,
Total_submited_work VARCHAR(50) NOT NULL
);
অস্থায়ী টেবিল গুলো আমরা স্বল্প প্রয়োজনে ব্যবহার করবো। এতে ডেটাবেজে জায়গাও সাশ্রয় হয়।
আপনি ডেটাবেজে কখনই অস্থায়ী টেবিলের তথ্য দেখতে পারবেন না। আপনি যদি SHOW TABLES
কমান্ড ব্যবহার করে আপনার টেবিল লিষ্ট বের করেন সেখানেও অস্থায়ী টেবিলটি খুঁজে পাবেন না। এখন আপনি যদি লগ-আউট করেন অর্থাৎ আপনার বর্তমান MySql সেশনটি শেষ হওয়ার পর আপনি আর এই টেবিলের তথ্য গুলো অ্যাক্সেস(Access) করতে পাবেন না। এমন কি আপনার অস্থায়ী টেবিলটিও আর থাকবে না।
MySql ডেটাবেজের ক্ষেত্রে ডেটাবেজ কানেকশনের সমাপ্তি ঘটলেই অস্থায়ী টেবিল মুছে যায়। কিন্তু আপনি যাদি ডেটাবেজের কাজ সম্পন্ন হওয়ার পূর্বেই অস্থায়ী টেবিল মুছে ফেলতে চান তাহলে DROP TABLE
কমান্ড ব্যবহার করতে পারেন।
DROP TABLE name_of_table;
SQL Injection হলো কোড ইঞ্জেক্ট করার একটি কৌশল যা আপনার ডেটাবেজকে ধ্বংস করে দিতে পারে।
ওয়েবপেজ এর মাধ্যমে ডেটাবেজে খারাপ(malicious ) কোড ইনপুট/জমা করে রাখাই হলো SQL Injection।
ওয়েব সাইট হ্যাকিং কৌশলগুলোর মধ্য SQL Injection অন্যতম।
পূর্ববর্তী অধ্যায়গুলোতে আমরা শিখে এসেছি SQL ব্যবহার করে কিভাবে ডেটাবেজের তথ্য আপডেট এবং পুনরূদ্ধার করতে হয়।
ওয়েব পেজে ইউজারদেরকে প্রায়ই তাদের নিজস্ব সার্চ ভ্যালু ব্যবহার করার অনুমতি দেওয়া হয় যা ব্যবহার করে তারা ওয়েব পেজের তথ্য প্রদর্শন করতে পারে।
SQL স্টেটমেন্ট-সমূহ শুধুমাত্র টেক্সট হওয়ায় ইউজার খুব সহজেই ডায়নামিকভাবে SQL কোড গুলোকে পরিবর্তন করে ফেলতে পারেঃ
ওয়েবপেজ থেকে আপনি যখন ইউজারকে তথ্য ইনপুট এর সুযোগ দেন কেবল তখনই SQL Injection ঘটে। যেমন- আপনি ইউজারকে তার নাম/আইডি ইনপুট করতে বললেন, কিন্তু সে নাম/আইডি এর পরিবর্তে ইনপুট হিসাবে নিম্নের ন্যায় SQL কমান্ড ইনপুট দিল এবং যা আপনি আপনার নিজের অজান্তেই আপনার ডেটাবেজে রান করালেন।
উদাহরণ
solidUserId = getRequestString("User_Id");
solidSQL = "SELECT * FROM Total_Users
WHERE User_Id = " + solidUserId;
উপরের উদাহরণে সিলেক্ট স্ট্রিং এর সাথে solidUserId ভ্যারিয়েবলটি যোগ করে একটি SELECT
স্টেটমেন্ট তৈরি করা হয়েছে যা ইউজার এর নিকট হতে তথ্য ইনপুট নিয়ে ডেটাবেজ থেকে সংশ্লিষ্ট তথ্য নিয়ে আসে।
SQL Injection
এমন একটি কৌশল যা ওয়েব পেজের মাধ্যমে ডেটাবেজে খারাপ কোড ইনপুট দিয়ে SQL কমান্ড ইঞ্জেক্ট করতে পারে।
ইঞ্জেক্টকৃত SQL কমান্ড পূর্ববর্তী SQL কমান্ড গুলোকে পরিবর্তন করতে পারে যা ওয়েব এপ্লিকেশনের নিরাপত্তায় বিঘ্ন সৃষ্টি করে।
উপরের উদাহরণটিতে আরো একবার লক্ষ্য করুন, ঐ কোডের মূল উদ্দেশ্য ছিল ইউজার আইডির মাধ্যমে একটি ইউজারকে সিলেক্ট করার জন্য SQL স্টেটমেন্ট তৈরি করা।
যদি ইউজারকে ভুল ইনপুট প্রদানে বাধা দেওয়া না হয়, তাহলে ইউজার নিম্নের মত কিছু স্মার্ট ইনপুট প্রবেশ করাবেঃ
User_Id:
সার্ভারের ফলাফল
SELECT * FROM Total_Users WHERE User_Id = 103 or 1=1
উপরের কোড একটি বৈধ SQL স্টেটমেন্ট। যেহেতু WHERE 1 = 1 সর্বদাই সত্য, সুতরাং ইহা ইউজার টেবিল থেকে সকল তথ্য রিটার্ন করবে।
উপরের উদাহরণটি কি আপনার কাছে বিপজ্জনক বলে মনে হচ্ছে?
একবার ভেবে দেখুন যদি এই টেবিলে ইউজার এর নাম এবং পাসওয়ার্ড থাকতো তাহলে কি হত?
নিম্নের SQL স্টেটমেন্টি অনেকটা উপরের স্টেটমেন্ট এর মতইঃ
SELECT User_Id, User_Name, User_Pass
FROM Total_Users WHERE User_Id = 103 or 1=1
এক্ষেত্রে একজন স্মার্ট হ্যাকার ইনপুট ফিল্ডে 103 অথবা 1=1 ইনপুট করে ডেটাবেজ থেকে খুব সহজেই ইউজারের সকল তথ্য অ্যাক্সেস করতে পারবে।
ইউজার লগ-ইন ভেরিফাই করার জন্য নিম্নে একটি সাধারন এইচটিএমএল ফর্ম এর গঠন দেওয়া হলোঃ
User Name:
Password:
User_Name = getRequestString("User_Name");
User_Pass = getRequestString("User_Pass");
sql = "SELECT * FROM Total_Users WHERE User_Name ='" + User_Name + "'
AND User_Pass ='" + User_Pass + "'"
এক্ষেত্রে একজন স্মার্ট হ্যাকার ইনপুট ফিল্ডে " " OR " "=" " ইনপুট করে খুব সহজেই ডেটাবেজ থেকে ইউজারের সকল তথ্য অ্যাক্সেস করতে পারে।
সার্ভার কোড নিম্নের মত একটি বৈধ SQL স্টেটমেন্ট তৈরি করবেঃ
SELECT * FROM Total_Users WHERE User_Name ="" or ""=""
AND User_Pass ="" or ""=""
উপরের স্টেটমেন্টটি একটি বৈধ SQL স্টেটমেন্ট। এটি টেবিল থেকে ইউজারের সকল তথ্য রিটার্ন করবে যেখানে WHERE ""="" সর্বদাই সত্য।
অধিকাংশ ডেটাবেজই ব্যাচ SQL স্টেটমেন্ট সাপোর্ট করে। দুই বা ততোধিক SQL স্টেটমেন্ট এর সমষ্টিই হলো ব্যাচ SQL স্টেটমেন্ট। একটি স্টেটমেন্ট থেকে অন্য একটি স্টেটমেন্টকে আলাদা করতে সেমিকোলন ব্যবহার করা হয়।
SELECT * FROM Total_Users;
DROP TABLE Users_Student;
উপরের SQL স্টেটমেন্টটি "Total_Users" টেবিলের সকল তথ্য রিটার্ন করবে এবং "Users_Student" টেবিলটিকে ডিলেট করে দিবে।
ধরুন, নিম্নের ন্যায় আমাদের সার্ভার কোড আছেঃ
solidUserId = getRequestString("User_Id");
solidSQL = "SELECT * FROM Total_Users WHERE User_Id = " + solidUserId;
এবং একজন ইউজার নিম্নের মত ইনপুট দিলঃ
User id:
তাহলে সার্ভারে নিম্নের মত একটি বৈধ SQL স্টেটমেন্ট তৈরি হবেঃ
SELECT * FROM Total_Users WHERE UserId = 103;
DROP TABLE Users_Student;
কোনো কোনো ওয়েব ডেভেলোপার কিছু নির্দিষ্ট শব্দ বা ক্যারেক্টারকে "blacklist" করে রাখে। হ্যাকাররা যেন এই শব্দ বা ক্যারেক্টার গুলো ইনপুট ফিল্ডের সার্স প্যারামিটার হসাবে ব্যবহার করে SQL ইনজেকশন ঘটাতে না পারে।
ইহা খুব একটা কার্যকরী পদ্ধতি নয়। কিছু শব্দ যেমন- delete
অথবা drop
এবং কিছু ক্যারেক্টার যেমন- সেমিকোলন(;) অথবা উদ্ধৃতি চিহ্ন("") সকল SQL ভাষাতেই ব্যবহত হয়। তাই এই শব্দ বা ক্যারেক্টারসমূহ ইনপুটে সম্মতি দেওয়া উচিৎ।
SQL ইনজেকশন আক্রমণকে প্রতিরোধ করার সবচেয়ে কার্যকরী এবং সঠিক পদ্ধতি হলো SQL প্যারামিটার ব্যবহার করা।
SQL প্যারামিটার হলো ভ্যালু যা SQL কুয়েরি সম্পাদনের সময় যুক্ত করা হয়। ইহা SQL এর কন্ট্রোলার হিসাবে কাজ করে।
আপনি যদি আপনার ওয়েবসাইটের মাধ্যমে ডেটাবেজে ডেটা সংরক্ষন করে পুনরায় পেতে চান তাহলে আপনার ওয়েব সার্ভার SQL ভাষা ব্যবহার করে এমন একটি ডেটাবেজে-সিস্টেমে এক্সেস থাকতে হবে।
আপনি যদি Internet Service Provider(ISP) কর্তৃক আপনার ওয়েব সার্ভার হোস্ট করে থাকেন তাহলে আপনাকে SQL হোস্টিং প্ল্যান খুঁজতে হবে। MySQL, SQL Server, MS SQL Server এবং MS Access ইত্যাদি রিলেশনাল ডেটাবেজ-সমূহ সচারচর ব্যবহত SQL হোস্টিং ডেটাবেজ ।
MySQL ওয়েবসাইটের জন্য জনপ্রিয় এবং অধিক ট্রাফিকযুক্ত একটি ডেটাবেজ সফটওয়্যার।
MySQL অনেক শক্তিশালী এবং সম্পূর্ন বৈশিষ্ট্যযুক্ত SQL ডেটাবেজ সিস্টেম।
ডেটাবেজ চালিত অধিক ট্রাফিকযুক্ত ওয়েবসাইটের জন্য ওরাকলও একটি জনপ্রিয় ডেটাবেজ সফটওয়্যার।
ওরাকল অনেক শক্তিশালী এবং সম্পূর্ন বৈশিষ্ট্যযুক্ত SQL ডেটাবেজ সিস্টেম।
ডেটাবেজ চালিত অধিক ট্রাফিকযুক্ত ওয়েবসাইটের জন্য মাইক্রোসফট SQL সার্ভার একটি জনপ্রিয় ডেটাবেজ সফটওয়্যার।
SQL সার্ভার অনেক শক্তিশালী এবং সম্পূর্ন বৈশিষ্ট্যযুক্ত SQL ডেটাবেজ সিস্টেম।
মাইক্রোসফট এক্সেস সাধারণ ডেটাবেজের জন্য একটি ভালো সমাধান।
অধিক ট্রাফিকযুক্ত ওয়েব সাইটের জন্য এক্সেস ভালো কাজ করে না এবং ইহা MySQL, SQL সার্ভার অথবা ওরাকলের মত শক্তিশালী না।